package com.tedu.api.io;

import com.sun.scenario.effect.impl.sw.sse.SSEBlend_SRC_OUTPeer;
import org.junit.Test;

import java.io.*;

/**
 * IO ：传输数据   C/S级别   聊天室   Version
 * API上部分：字符串、包装类、日期类、集合
 * --------------电脑三大件：CPU 硬盘 内存
 * API下半部分：IO流   ---硬盘---文件数据传输
 *
 * 包位置：java.io
 * File文件、文件夹类
 * 作用：用于表示操作系统中系统的一个文件或者“目录：文件夹”
 * 创建File对象-->有参构造器-->“路径+文件/文件夹全称”
 *
 * File类方法使用：
 * 1.查看该文件或者”文件夹：目录“的属性信息（名字、大小、是否存在）
 * 2.操作文件夹或者”文件夹：目录“（创建、删除）
 * 3.访问一个目录的子项
 */
public class FileAPI {
    @Test
    public void testFileAPI(){
        //创建文件夹类
        //需求：当前API下创建文件--手动--demo.txt
//        File file=new File("D:\\api\\API\\src\\main\\java\\com\\tedu\\api\\io\\demo.txt");
        //绝对路径
        //判断文件是否存在的方法：exists
//        boolean b=file.exists();
//        System.out.println("判断文件是否存在："+b);
        //相对路径--当前API下创造文件！  项目：Maven结构  main编写代码
        //FileAPI  相对于   API  项目下-->从src开始
        //操作系统：路径  \ 代表路径 文件上传至服务器 平时用这个
        //              / 代表路径 文件下载到本地
        //Java可以在任何操作系统【平台】 下运行  统一路径属性
        //File.separator  静态属性：任何操作系统下转换成正确的路径表示方式
        File file=new File("src"+File.separator+"main"+File.separator+"java"
                +File.separator+"com"+File.separator+"tedu"+File.separator
                +"api"+File.separator+"io"+File.separator+"demo.txt");
//        判断文件是否存在的方法：exists
        boolean b=file.exists();
        System.out.println("判断文件是否存在："+b);
    }
    /**
     * 查看文件夹或者文件夹属性信息：
     * getName()  返回值：String
     * 作用：获取文件的名字【注意：】
     * length()   返回值：long
     * 作用：返回当前文件的大小【字节量】
     * exists()   返回值：boolean
     * 作用：判断文件是否存在
     */
    @Test
    public void testFileGL() throws IOException {
        //创建文件类---路径：Maven项目--相对路径
        //相对路径：./ 当前API项目下
        File file=new File("."+File.separator+"demo.txt");
        //打印 file 的路径
        System.out.println("打印file路径："+file.getCanonicalPath());
        //文件是否存在
        System.out.println("路径文件是否存在:"+file.exists());
        //获取文件/文件夹名字
        String name=file.getName();
        System.out.println("文件或者文件夹的名字"+name);
        long lea=file.length();
        System.out.println("获取文件的大小："+lea);
    }
    /**
     * 使用代码完成文件或者目录自动创建
     * createNewFile()
     * 作用：常见一个新文件
     * 需求：使用代码完成 在API项目文件下 自动创建test.txt
     */
    @Test
    public void testCreate() throws IOException {
        //创建文件类：路径+全称 ./test.txt
        File file=new  File("."+File.separator+"test.txt");
        //判断--如果文件不存在---创建
        //     如果文件存在 ---创建
        if(!file.exists()){
            System.out.println("文件不存在~~");
            file.createNewFile();
            System.out.println("文件已经创建~");
        }else {
            System.out.println("文件存在，别创建了~");
        }
    }
    /**
     * 文件的删除 ：删除文件或者文件夹
     * delete()
     * 需求：将API目录下的 test.txt删除
     */
    @Test
    public void testDelete(){
        //创建File类   路径：./test.txt   ./不写代表 当前项目【在单元测试里面】
        File file=new File("test.txt");
        //判断 如果文件存在，删除
        //    如果文件不存在，不删除
        if (file.exists()){
            System.out.println("文件存在");
            file.delete();
            System.out.println("文件已删除~~");
        }else{
            System.out.println("文件已经删除了");
        }
    }
    /**
     * mkdir
     * 作用：创建一个文件夹
     * 需求：在API项目下创建一个文件夹 demo
     *
     *
     * 多层文件夹：demo/abc/bcd
     */
    @Test
    public void testMkdir(){
        //创建File文件/文件夹
        File file=new File("demo"+""+File.separator+"abc"+""+File.separator+"bcd");
        //判断 如果demo存在，创建
        //    如果demo不存在，不创建
        if (!file.exists()){
            System.out.println("文件夹不存在");
            file.mkdirs();
            System.out.println("文件夹已创建");
        }else {
            System.out.println("文件夹已存在不用重复创建");
        }
    }
    /**
     * 作业1 删除多层文件夹 demo/abc/bcd  【不能用递归】
     * 提示：构造器 new File(file parent,"子路径");
     *      不需要exists判断
     *      思路：找到每一级路径【bcd删除完毕--abc删除完毕--demo删除完毕】
     * 先删bcd
     */
    @Test
    public void test删文件夹(){
        File file0=new File("demo"+""+File.separator+"abc"+""+File.separator+"bcd");
        if (file0.exists()){
            System.out.println("文件夹bcd存在");
            file0.delete();
            System.out.println("文件夹bcd已删除~~");
        }else{
            System.out.println("文件夹bcd已经删除了");
        }
        File file1=new File("demo"+""+File.separator+"abc");
        if (file1.exists()){
            System.out.println("文件夹abc存在");
            file1.delete();
            System.out.println("文件夹abc已删除~~");
        }else{
            System.out.println("文件夹abc已经删除了");
        }
        File file2=new File("demo");
        if (file2.exists()){
            System.out.println("文件夹demo存在");
            file2.delete();
            System.out.println("文件夹demo已删除~~");
        }else{
            System.out.println("文件夹demo已经删除了");
        }
    }
    @Test
    public void test短一点的删文件夹(){
        File parent=new File("demo"); //  父级：demo
        File child1=new File(parent,"abc");// 父+子 demo/abc
        File child2=new File(child1,"bcd"); //父+子+子 demo/abc/bcd
            child2.delete();
            child1.delete();
            parent.delete();
        System.out.println("删了");
    }

    /**
     * 访问文件夹-->所有的子项【文件和文件夹】
     * listFiles()   返回值：File[] 文件数组
     * 作用：获取文件夹的所有子项【包含文件夹和文件】
     * isFile()  返回值：boolean
     * 作用：判断是否为文件，是文件true，反之false
     * isDirectory 返回值：boolean
     * 作用：判断是否为文件夹，是文件夹true，反之false
     * 需求：获取API项目下 所有的文件夹文字
     *
     */
    @Test
    public void testListFiles() throws IOException {
        //获取API项目
        File file=new File("."+File.separator);
        System.out.println(file.getCanonicalFile());
        //过滤：3个文件还有4个文件夹，过滤是文件夹的
        if(file.isDirectory()){  //--过滤无效果--
            //获取所有文件夹
            File[] dir=file.listFiles();
            //遍历所有文件夹名称
            for(int i=0;i< dir.length;i++){// i  拿到所有下标
                //打印文件夹名字
                System.out.println(dir[i].getName());
            }
        }
    }
}
